<?php
/**
 * Класс Controller_Ajax_Team отвечает за обработку ajax-запросов, связанных с командами
 * @author Mike
 */
class Controller_Ajax_Team extends Controller_Ajax {
	
	public function actionSwitch() {
		switch ($this->arrRequest[2]) {
			case 'request' : 
				$this->actionRequestQuery();
				break;
			case 'request-handler' :
				$this->actionRequestHandler();
				break;
			case 'make-admin' :
				$this->actionMakeAdmin();
				break;
			case 'kill-admin' :
				$this->actionKillAdmin();
				break;
			case 'del-pers' :
				$this->actionDeleteFromTeam();
				break;
			case 'avatar-upload' :
				$this->actionAvatarUpload();
				break;
			default:
				$this->setError(404);
				break;
		}
	}
	
	/**
	 * Обработка заявки на вступление и выход из команды
	 */
	private function actionRequestQuery() {
		$teamId = isset($_POST['ID_team']) ? Service_Escape::absolutelyEscapeString($_POST['ID_team']) : '';
		$action = isset($_POST['action']) ? $_POST['action'] : '';
		$status = isset($_POST['status']) ? Service_Escape::absolutelyEscapeString($_POST['status']) : '';
		$userId = User_Seance::getId();

		if (empty($teamId) || empty($userId) || empty($action) ||  ($action == 'add' && ($status != 1 && $status != 2)) ) return $this->makeStandardError('Не получены данные или ты не юзер по жизни');
		
		$objTeam = new Team($teamId);
		// Если нет команды с переданным id
		if(!$objTeam->id) return $this->makeStandardError('Передан id несуществующий команды');
		
		$userTeamStatusArray = $objTeam->getTeamStatuses($userId);
		
		if ($action == 'add') {
			// Проверяем нет ли уже заявок текущего пользоватлея на вступление в текущую команду
			if(RequestToTeam::getResponse($userId, $teamId)) return $this->makeStandardError('Заявка от пользователя у которого уже есть заявка на эту команду - Какого хуя??');
			
			//Проверяем статус пользователя для текущий команды
			if(empty($userTeamStatusArray))  { // Залогиненный пользователь(не админ), не имеющий никакого отношения к команде
				if($objTeam->getField('entry_restrict') == 1 && $status == 2 || $status == 1) { // Заявка на вступление игрока или болельщика в команду с запретом быстрого вступления болельщикам
					$RequestToAddObj = new RequestToTeam(array('ID_user' => $userId, 'ID_team' => $teamId, 'status' => $status));
					if($RequestToAddObj->save()) $this->arrReturn = array('result' => 'user-request-added');
				}
				else { // Подача заявки болельзиком в команду с быстрым доступом для болельщиков
					$objUserTeam = new TeamUser(array('ID_user' => $userId, 'ID_team' => $objTeam->id, 'status' => 2));
					if($objUserTeam->save()) $this->arrReturn = array('result' => 'user-added');
				}
			}
			elseif($userTeamStatusArray['is_admin'] == 2 && !$userTeamStatusArray['status']) { // Админ-созадтель команды, пока в неё не входивший
				$objTeamUser = new TeamUser($userTeamStatusArray['ID_user_team']);
				if($objTeamUser->updateFields(array('status' => $status))) $this->arrReturn = array('result' => 'admin-added');
			}
			else return $this->makeStandardError('Уже в команде. Не ломай мне всю систему.');
		}
		elseif ($action == 'leave' && !empty($userTeamStatusArray)) {
			if ($userTeamStatusArray['is_admin'] == 2 && TeamUser::updateStatus($userId, $teamId,  null)) $this->arrReturn = array('result' => 'removed');
			elseif (TeamUser::deleteFromTeam($userId, $teamId)) $this->arrReturn = array('result' => 'removed');
		}
	}
	
	/**
	 * Обработка запросов связанных с принятием/отклонением заявок на вступления в команду
	 */
	private function actionRequestHandler() {
		$teamId = isset($_POST['ID_team']) ? Service_Escape::absolutelyEscapeString($_POST['ID_team']) : '';
		$userId = isset($_POST['ID_user']) ? Service_Escape::absolutelyEscapeString($_POST['ID_user']) : '';
		$action = isset($_POST['action']) ? Service_Escape::absolutelyEscapeString($_POST['action']) : '';
	
		if (empty($teamId) || empty($userId) || empty($action)) return $this->makeStandardError('Не получены данные');
	
		$objTeam = new Team($teamId);
		if(!$objTeam->id) return $this->makeStandardError('Передан id несуществующей команды');
		if(!$objTeam->isTeamAdmin()) return $this->makeStandardError('Недостаточно прав для выполнения действия');
		
		// Проверяем существует ли заявка с заданными id команды и id пользователя
		$responseArr = RequestToTeam::getResponse($userId, $teamId);
		if(empty($responseArr)) return $this->makeStandardError('Попытка обработки несуществующей заявки');
		if($action == 'accept') {
			$objUserTeam = new TeamUser(array('ID_user' => $userId, 'ID_team' => $objTeam->id, 'status' => $responseArr['status']));
			if(RequestToTeam::deleteRequest($userId, $objTeam->id) && $objUserTeam->save()) $this->arrReturn = array('result' => 'accepted');
		}
		elseif($action == 'refuse') {
			if(RequestToTeam::deleteRequest($userId, $objTeam->id)) $this->arrReturn = array('result' => 'refused');
		}
	}
	
	/**
	 * Обработка запросов связанных с назначением администраторов команд
	 */
	private function actionMakeAdmin() {
		$teamId = isset($_POST['ID_team']) ? Service_Escape::absolutelyEscapeString($_POST['ID_team']) : '';
		$userId = isset($_POST['ID_user']) ? Service_Escape::absolutelyEscapeString($_POST['ID_user']) : '';
		
		if (empty($teamId) || empty($userId)) return $this->makeStandardError('Не получены данные');
		
		$objTeam = new Team($teamId);
		if(!$objTeam->id) return $this->makeStandardError('Передан id несуществующей команды');
		if(!$objTeam->isTeamAdmin()) return $this->makeStandardError('Недостаточно прав для выполнения действия');
		
		$userTeamStatusArray = $objTeam->getTeamStatuses($userId);
		
		if(empty($userTeamStatusArray) || $userTeamStatusArray['is_admin']) return $this->makeStandardError('Недопустимые действия');
		
		if($objTeam->makeAdmin($userId)) $this->arrReturn = array('result' => 'OK');
		
	}
	
	/**
	 * Обработка запросов связанных с удалением прав администраторов команд
	 */
	private function actionKillAdmin() {
		$teamId = isset($_POST['ID_team']) ? Service_Escape::absolutelyEscapeString($_POST['ID_team']) : '';
		$userId = isset($_POST['ID_user']) ? Service_Escape::absolutelyEscapeString($_POST['ID_user']) : '';
	
		if (empty($teamId) || empty($userId)) return $this->makeStandardError('Не получены данные');
	
		$objTeam = new Team($teamId);
		if(!$objTeam->id) return $this->makeStandardError('Передан id несуществующей команды');
		if(!$objTeam->isTeamAdmin()) return $this->makeStandardError('Недостаточно прав для выполнения действия');
	
		$userTeamStatusArray = $objTeam->getTeamStatuses($userId);
		
		// Если права отбираются у пользователя, который не имеет связи с командой или не является админом или пытаются отнять права у админа-создателя
		if(empty($userTeamStatusArray) || !$userTeamStatusArray['is_admin'] || $userTeamStatusArray['is_admin'] == 2) return $this->makeStandardError('Недопустимые действия');
	
		if($objTeam->KillAdmin($userId)) $this->arrReturn = array('result' => 'OK');
	
	}
	
	/**
	 * Обработка запросов связанных с удалением из команды(админ удаляет)
	 */
	private function actionDeleteFromTeam() {
		$teamId = isset($_POST['ID_team']) ? Service_Escape::absolutelyEscapeString($_POST['ID_team']) : '';
		$userId = isset($_POST['ID_user']) ? Service_Escape::absolutelyEscapeString($_POST['ID_user']) : '';
		$currentUserId = User_Seance::getId();
		
		if (empty($teamId) || empty($userId)) return $this->makeStandardError('Не получены данные');
	
		$objTeam = new Team($teamId);
		if(!$objTeam->id) return $this->makeStandardError('Передан id несуществующей команды');
		if(!$objTeam->isTeamAdmin()) return $this->makeStandardError('Недостаточно прав для выполнения действия');
	
		$userTeamStatusArray = $objTeam->getTeamStatuses($userId);
		
		// Если для заданного пользователя нет связи с заданной командой или удалить пытаются создателя или админ пытается удалить сам себя
		if(empty($userTeamStatusArray) || $userTeamStatusArray['is_admin'] == 2 || $userId == $currentUserId) return $this->makeStandardError('Недопустимые действия');
		
		if(TeamUser::deleteFromTeam($userId, $teamId)) $this->arrReturn = array('result' => 'OK');
	}
	
	/**
	 * Добавление автара
	 */
	private function actionAvatarUpload() {
		$teamId = isset($_GET['ID_team']) ? Service_Escape::absolutelyEscapeString($_GET['ID_team']) : '';
		if (empty($teamId)) return $this->makeStandardError('Не получены данные');
		
		$objTeam = new Team($teamId);
		if(!$objTeam->id || !$objTeam->isTeamAdmin()) return $this->makeStandardError('Недостаточно прав для выполнения действия');

		$allowedExtensions = array('jpg','png');
		$sizeLimit = 5 * 1024 * 1024;
		$uploader = new Service_qqFileUploader($allowedExtensions, $sizeLimit);
		$uploadDirectory = IMAGES . '/essence/team/' . $objTeam->id;	// Если менять, то так же поменять в qqFileUploader->saveTeamAvatar
			
		$result = $uploader->handleUpload($uploadDirectory, true, 'team-ava', $objTeam);
		$this->arrReturn = $result;
	}
}
?>